package com.streamax.app.cqbus.platform.ext

import android.util.Base64
import com.kt.coroutinedemo.utils.DateTime
import com.kt.coroutinedemo.utils.DecodeUtils

import kotlin.experimental.and
import kotlin.experimental.or


/**
 * 此类为ByteArray解析扩展
 */

/**
 * 扩展解析日期方法
 */
val ByteArray.decodeDateTime: DateTime?
    get() = run {
        if (this.size < 6) {
            //不满足转换条件  yy-MM-dd HH:mm:ss
            null
        } else {
            DecodeUtils.decodeDateTime(this)
        }
    }

/**
 * 解析里程
 */
val ByteArray.decodeMileage: MutableList<Int>?
    get() = run {
        if (this.size != 3) {
            //不满足转换条件  yy-MM-dd HH:mm:ss
            null
        } else {
            val list = mutableListOf(0, 0)
            list[0] = 1
            list
        }
    }

/**
 *  将ByteArray转换为Base64字符串
 */
val ByteArray.base64ToString : String
    get() = run {
        Base64.encodeToString(this, Base64.DEFAULT)
    }


/**
 * 截取ByteArray长度解析
 */
fun ByteArray.capture(start: Int, end: Int): ByteArray {
    return if (start > end || end >= this.size || start < 0 ) {
        //错误长度
        byteArrayOf()
    } else {
        val buffer = ByteArray(end - start + 1)
        var i = 0
        while (start+i <= end) {
            buffer[i] = this[start + i]
            i++
        }
        buffer
    }
}

/**
 * Kotlin中可以使用位运算符来设置byte八个位的值，具体如下
 */
fun Byte.withBit(index: Int, bit: Int): Byte {
    return if (bit == 0) this and (1 shl index).inv().toByte()
    else this or (1 shl index).toByte()
}

/**
 * TODO 转
 *
 * @param buffer
 * @param offset
 * @return
 */
fun ByteArray.toInt(offset: Int): Int {
    return ((this[offset].toInt() shl 8) + this[offset + 1].toInt())
}

/**
 * ByteArray转ip
 */
fun ByteArray.toIpString() :String{
    return if (this.size == 4){
         DecodeUtils.getIpAddress(this,0)
    }else{
        "0.0.0.0"
    }
}


/**
 * 根据位置获取Byte
 * 00 7d 8b f0 18 ff ef ff
 */
fun ByteArray.getByteByPosition(position :Int) : Byte{
    if (position in 0..7 && this.size == 8){
      return  this[position]
    }
    return  0
}




